﻿using MugenInjection.Infrastructure;
using MugenInjection.Interface;

namespace MugenInjection.Syntax.Constant
{
    /// <summary>
    /// Specific fluent syntax for constant binding.
    /// </summary>
    public interface IConstantPrioritySyntax : IBindingBuilder
    {
        /// <summary>
        /// Sets the priority for binding.
        /// </summary>
        /// <param name="priority">The specified <see cref="BindingPriority"/>.</param>
        /// <returns>The fluent syntax.</returns>
        IConstantObjectSyntax SetPriority(BindingPriority priority);

        /// <summary>
        /// Sets a standard priority for binding.
        /// </summary>
        /// <returns>The fluent syntax.</returns>
        IConstantObjectSyntax SetStandardPriority();

        /// <summary>
        /// Sets a low priority for binding.
        /// </summary>
        /// <returns>The fluent syntax.</returns>
        IConstantObjectSyntax SetLowPriority();

        /// <summary>
        /// Sets a normal priority for binding.
        /// </summary>
        /// <returns>The fluent syntax.</returns>
        IConstantObjectSyntax SetNormalPriority();

        /// <summary>
        /// Sets a high priority for binding.
        /// </summary>
        /// <returns>The fluent syntax.</returns>
        IConstantObjectSyntax SetHighPriority();
    }

    /// <summary>
    /// Specific fluent syntax for constant binding.
    /// </summary>
    public interface IConstantPrioritySyntax<T> : IBindingBuilder
    {
        /// <summary>
        /// Sets the priority for binding.
        /// </summary>
        /// <param name="priority">The specified <see cref="BindingPriority"/>.</param>
        /// <returns>The fluent syntax.</returns>
        IConstantObjectSyntax<T> SetPriority(BindingPriority priority);

        /// <summary>
        /// Set a standard priority for binding.
        /// </summary>
        /// <returns>The fluent syntax.</returns>
        IConstantObjectSyntax<T> SetStandardPriority();

        /// <summary>
        /// Sets a low priority for binding.
        /// </summary>
        /// <returns>The fluent syntax.</returns>
        IConstantObjectSyntax<T> SetLowPriority();

        /// <summary>
        /// Sets a normal priority for binding.
        /// </summary>
        /// <returns>The fluent syntax.</returns>
        IConstantObjectSyntax<T> SetNormalPriority();

        /// <summary>
        /// Sets a high priority for binding.
        /// </summary>
        /// <returns>The fluent syntax.</returns>
        IConstantObjectSyntax<T> SetHighPriority();
    }
}